from typing import List

from redis import Redis

from ..graph.base import BaseGraph
from ..graph.nodes import *
from ..parser.xml_parser import XmlToolResultParser


class BlogRunGraph(BaseGraph):
    """
    专业的博客内容管理AI助手。仅限于用户在问题中包含了具体的博客链接。不接收如下类型问题：博客页面、博客系统、博客主页、博客信息等，这类问题中不包含链接的问题必须排除该worker。
    可以根据用户提供的博客链接, 对博客进行内容获取、智能分析、内容优化、代码处理和内容部署等功能，并最终将优化后的内容部署到目标平台。
    特别声明：如果问题中不包含链接地址，则必须排除该worker，即使它是唯一看起来相关的选项。
    系统会根据用户输入的问题自动分析并设置以下参数：
    - url (必选): 基于用户问题提取出博客链接地址，如: https://blog.csdn.net/xxx/xxxx/xxxx
    """

    def __init__(self,
                 redis: Redis = None,
                 nodes: List[BaseNodes] = [],
                 agent_template: str = "agent_blog",
                 **kwargs):
        super().__init__(graph_name="agent_blog_",
                         agent_template=agent_template,
                         redis=redis,
                         **kwargs)
        nodes = nodes if nodes else []
        web_node = WebNodes()
        self.nodes = nodes if nodes else [CompletionNodes(),
                                          FileNodes().write_to_file,
                                          web_node.load_blog_content,
                                          web_node.load_doc_from_web,
                                          ProjectNodes()]
        self.parser = XmlToolResultParser(tools=self.get_nodes_schema())

    async def get_system_template(self, request, state = None):
        """
        Override base implementation to add blog-specific default values.
        """
        if "docker_images" not in request.kwargs:
            request.kwargs["docker_images"] = ""
        if "project_templates" not in request.kwargs:
            request.kwargs["project_templates"] = ""

        return await super().get_system_template(request)
